package com.example.redisjson.documents;

import com.redis.om.spring.annotations.Document;
import com.redis.om.spring.annotations.Indexed;
import com.redis.om.spring.annotations.Searchable;
import lombok.*;
import org.springframework.data.annotation.Id;
import org.springframework.data.geo.Point;

import java.util.HashSet;
import java.util.Set;

@Getter
@Setter
@RequiredArgsConstructor(staticName = "of")
@AllArgsConstructor(access = AccessLevel.PROTECTED)
@Document
public class UserDocument {

    @Id
    private String id;

    @Searchable
    private String name;

    @Indexed
    private Point location;

    @Indexed
    private Set<String> tags = new HashSet<>();

    @Indexed
    private Integer numberOfEmployees;

    @Indexed
    private Integer yearFounded;

    private String url;

    private boolean publiclyListed;

}

// RedisJson 的数据传输实体使用 @RedisHash 注解，和 RedisSearch 的注解 @Document 类似。但两者有不同的作用，不能搞混淆了
// 使用 @Document (com.redis.om.spring.annotations.Document) 进行注释，这将该对象标记为 Redis 实体，以便由适当类型的存储库将其持久化为 JSON 文档。
// 对于使用 @Document 注释的实体，Redis OM Spring 将扫描字段并为实体的模式添加适当的搜索索引字段。
// 例如，对于 Person 类，将在应用程序启动时创建名为 com.redis.om.skeleton.models.PersonIdx 的索引。在索引模式中，将为每个使用 @Indexed 注释的属性添加搜索字段。
// 标记为 @Searchable (com.redis.om.spring.annotations.Searchable) 的字段（例如 Person 中的 personalStatement）在搜索索引模式中反映为全文搜索字段。即搜索索引模式中将包含一个全文搜索字段，该字段将包含该字段的所有值。

